package se.webbzon.boltzmann.minigame.botany;

import java.awt.Image;

import se.webbzon.boltzmann.minigame.sandbox.DefaultSandBoxItem;
import se.webbzon.boltzmann.minigame.sandbox.SandBox;
import se.webbzon.boltzmann.minigame.sandbox.SandBoxContainer;
import se.webbzon.boltzmann.minigame.sandbox.SandBoxItem;
import se.webbzon.boltzmann.minigame.sandbox.SandBoxListener;
import se.webbzon.oschi01.resourceset.ResourceSet;

public abstract class SandBoxMolecule extends DefaultSandBoxItem {
	
	// A sand box listener
	private final Listener listener;
	
	/*============================================================
	Constructors
	============================================================*/

	public SandBoxMolecule() {
		Instance molecule = new Instance();
		listener = new Listener();
		setInstance(molecule);
		setDraggable(true);
		setDroppable(true);
	}
	
	/*============================================================
	Public Methods
	============================================================*/
	
	@Override public void onAttach(SandBox box) {
		super.onAttach(box);
		box.addListener(listener);
	}

	@Override public void onDetach(SandBox box) {
		box.removeListener(listener);
		super.onDetach(box);
	}
	
	/*============================================================
	Protected Methods
	============================================================*/
	
	/** Returns the image set of the molecule. **/
	protected abstract ResourceSet<Image> getImage();
	
	/*============================================================
	Private Classes
	============================================================*/
	
	private final class Instance extends AbstractMolecule {

		@Override protected ResourceSet<Image> getImage() {
			return SandBoxMolecule.this.getImage();
		}
		
	}
	
	private final class Listener implements SandBoxListener {

		@Override public void onInvoke(double x, double y) {};

		@Override public void onPick(SandBoxItem item, SandBoxContainer container) {
			if (item == SandBoxMolecule.this) { 
				((AbstractMolecule) getInstance()).grab();
			}
		}

		@Override public void onDrop(SandBoxItem item, SandBoxContainer container) {
			if (container == null && item == SandBoxMolecule.this) { 
				((AbstractMolecule) getInstance()).drop();
			}
		}
		
	}

}
